#!/usr/bin/env python
#-*-coding:utf-8-*-

'练车'
'''
    环境 python3.6
    使用 requests 模块 安装 pip install requests
    使用 beautifulsoup4 模块 pip install beautifulsoup4
    ide  pycharm
    网站: http://yykfyljx.ay001.net/NMobile/mLogin.htm
    注意 账号密码必须填写正确,全天有网,账号不是实时测试

'''
#---------------开始----------------#
import sys
import json
import time
import datetime
import requests

'''
输入资料
data 登录信息
information 其他信息 开始时间 结束时间 教练 等
注意!!
   筛选教练模块不完善,只能选一个教练,其他教练就会排除
   默认是你选的那个分组的,默认不满足找下面
'''
def get_data(data,information):
    temp_data=sys.argv
    data["LoginType"] = 0
    if(len(temp_data)<5):
        print('请输入账户:',end=' ')
        data["UserName"] = input()
        print('请输入密码:',end=' ')
        data["Password"] = input()
        print("请输入最早预约时间:",end=' ')
        information['start']=int(input())
        print("请输入最晚预约时间:",end=' ')
        information['end'] = int(input())
        print('请输入预约几天后的:',end=' ')
        information['after']=int(input())
        print('请输入教练名(科二不需要,直接回车即可):',end=' ')
        information['teacher']=input()
        if(len(information['teacher'])==0):
            information['teacher']=None
    else:
        data["UserName"]=temp_data[1]
        data["Password"]=temp_data[2]
        information['start'] =int(temp_data[3])
        information['end']=int(temp_data[4])
        information['after']=int(temp_data[5])
        if(len(temp_data)<=5) :
            information['teacher']=None
        else:
            information['teacher']=temp_data[6]
'''
    定时模块
    默认早上八点约
    after 几天后 默认 1 2 3
    temp_time 临时时间,为预约时间做准备
    temp_time 可设置提前,自己该代码 函数第3行 8 00 00
'''
def waite(after):
    year, mouth, day, hours, miu, se = datetime.datetime.now().strftime('%Y %m %d %H %M %S').split(' ')
    temp_time = datetime.datetime.strptime(year + ' ' + mouth + ' ' + day + ' ' + '8 00 00', '%Y %m %d %H %M %S')
    year = int(year)
    mouth = int(mouth)
    day = int(day)
    hours = int(hours)
    miu = int(miu)
    se = int(se)
    #print(year, mouth, day, hours, miu, se)
    while (temp_time < datetime.datetime.now()):
        temp_time = temp_time + datetime.timedelta(days=1)
        #print(temp_time)
    wait = time.mktime(temp_time.timetuple()) - time.time()
    temp_time=temp_time+datetime.timedelta(days=after-1)
    time.sleep(wait)
    #print(temp_time)
    return str(temp_time.date())

'''
    获取登录页面缓存
    f_log 日志文件
    cnt 尝试次数
    
'''
def get_cookies(f_log,cnt,url_open_cookies):
    i=1
    while i<=cnt:
        try:
            url_open_cookies.post(url='http://yykfyljx.ay001.net/Account/AppType')
            return
        except:
            i=i+1
'''
登录模块
f_log 日志文件
cnt 尝试次数
url_open_cookies 获取缓存的Session()
data 登录信息
'''
def login(f_log,cnt,url_open_cookies,data):
    i=1
    while i<=cnt:
        try:
            login_json=url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/AccountServer.asmx/MobileLogin',json=data).json()
            if(login_json['d']['Message']==''):
                f_log.write('登录成功,正在查询.....\n'.encode('utf-8'))
                return
            else:
                f_log.write((str(login_json['d']['Message'])+'\n').encode('utf-8'))
        except:
            i=i+1
    f_log.write('网页无法打开,登录异常\n'.encode('utf-8'))
    sys.exit(0)
'''
获取科目
f_log 日志文件
cnt 尝试次数
url_open_cookies 获取缓存的Session()
'''
def get_sub(f_log,cnt,url_open_cookies):
    i=1
    while i<=cnt:
     try:
         km=url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/BaseInfoServer.asmx/GetUserInfo',json={}).json()['d']['Data']['科目']
         f_log.write(('您正在练科目'+str(km)+'\n').encode('utf-8'))
         return km
     except:
         i=i+1
    f_log.write(('无法找到所练科目\n').encode('utf-8'))
    sys.exit(0)
'''
科三老师编号
待修改....
有更好的的办法
已废
'''
'''
def get_thr_group(f_log,cnt,url_open_cookies,teacher):
    i=1
    while i<=cnt:
        try:
           teacher_list = json.loads(url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/OrderCoachServer.asmx/GetTcListByGroup', json={}).json()['d'])['Data']
           for dic in teacher_list:
               teacher[dic['TB_排班__教练__姓名']] = dic['TB_排班__教练__编号']
           f_log.write((str(teacher)+'\n').encode('utf-8'))
           return
        except:
            i=i+1
    sys.exit(0)
'''
'''
获取教练
利用遍历 nUnitNO nPageIndex
f_log 日志文件
cnt 尝试次数
url_open_cookies 获取缓存的Session()
teacher 教练
'''
def get_teacher(f_log,cnt,url_open_cookies,teacher):
    i=1
    while i<=cnt:
        try:
           teach =json.loads(url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/OrderCoachServer.asmx/GetInfoByTimeId',json={"argDay": "2018-8-20", "nUnitNO": 1, "nPageIndex": 1}).json()['d']['Data'])['BusinessData']['教练信息']['Data']
           teacher[teach[0]['教练__姓名']]=teach[0]['教练__编号']
           for j in range(1,10):
               teach=json.loads(url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/OrderCoachServer.asmx/GetInfoByTimeId',json={"argDay": "2018-8-20", "nUnitNO": j, "nPageIndex": 2}).json()['d']['Data'])['BusinessData']['教练信息']['Data']

               if(len(teach)==0) :
                   f_log.write('姓 名\t     编号      \n'.encode('utf-8'))
                   for item in teacher.items():
                       f_log.write((item[0]+' '+item[1]+'\n').encode('utf-8'))
                   return
               teacher[teach[0]['教练__姓名']] = teach[0]['教练__编号']
        except:
            if(len(teacher)!=0) :
                f_log.write('没有查找玩所以教练,应该不影响约车\n姓 名\t     编号      \n'.encode('utf-8'))

                for item in teacher.items():
                    f_log.write((item[0] + '\t' + item[1] + '\n').encode('utf-8'))
                return
            i=i+1
    f_log.write('脚本异常,找不到教练'.encode('utf-8'))
    sys.exit(0)


'''
筛选教练 待完善（筛选,只能获取一个....）
f_log 日志文件
teacher 教练
filer 过滤名单 目前只支持一个
'''
def teacher_Filter(f_log,teacher,filer):
    if filer==None or len(filer)<=0 :
        return  teacher
    temp_teacher={}
    for it in teacher.items():
        if(it[0]==filer):
            temp_teacher[it[0]]=it[1]
    f_log.write(('选中教练 '+str(temp_teacher)+'\n').encode('utf-8'))
    return temp_teacher
'''
获取满足安排的教练课程
f_log 日志文件
cnt 尝试次数
url_open_cookies 获取缓存的Session()
teacher 教练
infotmation 一些筛选信息
time_list 获取的时间表
'''
def get_arrange(f_log,cnt,url_open_cookies,teacher,information,time_list):
    i=1
    f_log.write('教练\t编号\t开始时间\t结束时间\n'.encode('utf-8'))
    while i<=cnt:
        try:
            for it in teacher.items():
                arrange_data={"coachID":it[1],"date":information['time'],"subid":0}
                arrange_json=json.loads(url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/OrderCoachServer.asmx/GetTimesInfoByCoachIDNew',json=arrange_data).json()['d'])['Data']

                for tem in arrange_json:
                    #print([it[0], tem['编号'], tem['开始时间'], tem['结束时间'],tem['状态']])
                    if(tem['状态']=='可用' and int(tem['开始时间'][0:2])>=information['start'] and int(tem['结束时间'][0:2])<=information['end']):
                        time_list.append([it[0],tem['编号'],tem['开始时间'],tem['结束时间']])
                        f_log.write((it[0]+'\t'+str(tem['编号'])+'\t  '+tem['开始时间']+'\t  '+tem['结束时间']+'\n').encode('utf-8'))
            return
        except:
            i=i+1
    if len(time_list)>0:
        f_log.write('没有找完所以可预约时间!!,但不影响预约\n'.encode('utf-8'))
    else:
        f_log.write('查找教练安排失败!!\n'.encode('utf-8'))
        sys.exit(0)
'''
抢课
f_log 日志文件
cnt 尝试次数
url_open_cookies 获取缓存的Session()
time_list 满足课程时间
number 约几个
go_drive 约上的
'''
def let_go(f_log,cnt,url_open_cookies,time_list,number,go_drive):
    i=1
    cs=0
    sub=get_sub(f_log,cnt=cnt,url_open_cookies=url_open_cookies)
    f_log.write('开始抢.....\n'.encode('utf-8'))
    if len(time_list)<=0:
        f_log.write('无可选时间,预约失败!!!\n'.encode('utf-8'))
    while i<=cnt:
        try:
            data={"PXResID":"","SubID":sub,"stateID":time_list[0][1]}
            class_drive=url_open_cookies.post(url='http://yykfyljx.ay001.net/Server/OrderCoachServer.asmx/orderCoachNew',json=data).json()['d']
            #print(class_drive)
            if(class_drive['Item1']):
                go_drive.append(('\t'+str(cs) + '\t\t' + time_list[0][0] + '\t' + time_list[0][2] + '\t\t' + time_list[0][3] + '\t').encode( 'utf-8'))
                time_list.pop(0)
                cs=cs+1
                if(len(time_list)<=0) :
                   break
                elif(number<=cs):
                    break
            else:
                if class_drive['Item2'][0].find('您已经有'):
                    f_log.write(('已经预约过该时间  '+time_list[0][0]+' '+time_list[0][2]+' '+time_list[0][3]+'\n').encode('utf-8'))
                    time_list.pop(0)
                    cs=cs+1
                    if(cs>=number) :
                        break
                elif class_drive['Item2'][0].find('已经约满'):
                    f_log.write(('没有抢上该时间  '+time_list[0][0]+' '+time_list[0][2]+' '+time_list[0][3]+'\n').encode('utf-8'))
                    time_list.pop(0)
                else:
                    f_log.write('时间未到,等待中....\n'.encode('utf-8'))
                    time.sleep(0.1)
                if len(time_list)<=0:
                    break

        except:
            i=i+1
            f_log.write(('网络有问题,或者脚本已失效 尝试第'+str(i)+'次\n').encode('utf-8'))
    if (number == cs):
        f_log.write('预约成功!!!\n预约次数\t教练\t开始时间\t结束时间\n'.encode('utf-8'))
        for log in go_drive:
            f_log.write(log)
    else:
        f_log.write(('预约失败,成功预约' + str(cs) + '次\n预约次数\t教练\t开始时间\t结束时间\n').encode('utf-8'))
        for log in go_drive:
            f_log.write(log)
'''
cnt 尝试次数
number 预约次数
'''
if __name__=='__main__':
    number=1
    cnt=1
    headers={}
    headers['Content-Type'] = 'application/json';
    headers['User-Agent'] = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0'
    user_data={}
    information={}
    teacher={}
    time_list=[]
    go_drive=[]
    get_data(user_data,information)
    url_open_cookies = requests.Session()
    url_open_cookies.headers=headers
    url_open_cookies.timeout=2
    information['time']=waite(information['after'])
    with open('练车.log','ab') as f_log:
        f_log.write(('\n\n#----------'+(datetime.datetime.now().strftime('%Y-%m-%d'))+'-------------#\n\n').encode('utf-8'))
        get_cookies(f_log,cnt=cnt,url_open_cookies=url_open_cookies)
        login(f_log,cnt=cnt,url_open_cookies=url_open_cookies,data=user_data)
        get_teacher(f_log,cnt=cnt,url_open_cookies=url_open_cookies,teacher=teacher)
        teacher=teacher_Filter(f_log,teacher,information['teacher'])
        get_arrange(f_log,cnt=cnt,url_open_cookies=url_open_cookies,teacher=teacher,information=information,time_list=time_list)
        let_go(f_log=f_log,cnt=cnt,url_open_cookies=url_open_cookies,time_list=time_list,number=number,go_drive=go_drive)